IISで詳細ログ機能を用いてX-Forwarded-Forヘッダーの値をログに書き込む
IISでのX-Forwarded-Forヘッダー
IISでサーバーへのアクセス元IPを取得したい場合があります。
IIS 詳細ログ機能を用いると、X-Forwarded-Forヘッダーを取得することができるようになり、アクセス元IPがアクセスログに記録されるようになります。
※従来はサードパーティ製のプラグイン等を用いる必要がありましたが、現在はIIS7、8系向けにMicrosoftによってIIS拡張機能「IIS 詳細ログ」が提供されています。
※本記事の内容はAWS上のWindows Server 2008 R2、IIS 7.5で動作を確認しています。
IIS 詳細ログ(IIS Advanced Logging)のインストール
下記よりIIS 詳細ログのインストーラをダウンロードします。
・Download: IIS 詳細ログ (64 ビット) - Microsoft Download Center - Download Details
http://www.microsoft.com/ja-jp/download/details.aspx?id=7211
インストーラをダウンロードしたら、実行してIIS 詳細ログ機能をIISにインストールします。
X-Forwarded-ForヘッダーをIISで有効にする
IIS 詳細ログ(Advanced Logging)をインストールしたら、IIS Managerでサーバーのホームを表示します。詳細ログ機能が追加されていますので、クリックします。
画面右にある操作パネルから「ログ記録フィールドの編集」をクリックします。
「ログ記録フィールドの編集」ダイアログが表示されるので、「フィールドの追加」ボタンをクリックします。
「ログ記録フィールドの追加」ダイアログが表示されるので、下記を入力して「OK」ボタンをクリックします。
- フィールドID:X-Forwarded-For
- カテゴリ:Default
- ソースの種類:要求ヘッダー
- ソース名:X-Forwarded-For
詳細ログのログ定義一覧に戻ったら、ログ定義が有効になっていることを確認します。
次に、現在有効になっているログ定義を編集します。画面右にある操作パネルから「ログ定義の編集」をクリックします。
ログ定義画面が表示されるので、「フィールドの選択」ボタンをクリックします。
ログ記録フィールドの選択画面が表示されます。利用可能なフィールドにX-Forwarded-Forが追加されているので、これを選択します。その後、OKボタンをクリックします。
ログ定義画面に戻るので、操作パネルの「適用」をクリックします。
操作パネルの「詳細ログに戻る」をクリックし、詳細ログ画面に戻ります。ログの設定が完了したので、操作パネルの「詳細ログを有効にする」をクリックします。
この後、IISを再起動します。
※この操作パネルにある「クライアント ログ記録を有効にする」は詳細ログ機能でサポートされているクライアントからのHTTP POSTリクエストをログする機能です。
・Advanced Logging for IIS - Client Logging
http://www.iis.net/learn/extensions/advanced-logging-module/advanced-logging-for-iis-client-logging
PCからAWS上のWindows ServerにELB経由でアクセスしてみる
実際にPCからIISにロードバランサー経由でアクセスして、ロードバランサのIPではなく、PCのIPを取得することができるかを確認してみます。
AWS上でELBを立てて、その配下にWindows Server 2008 R2を配置します。
ELBのヘルスチェック用にIISのデフォルトのindexファイル(c:\inetpub\wwwroot\iisstart.htm)をコピーし、index.htmlにリネームしておきます。
また、自分のPCがWebにアクセスする際のIPを予め調べておきます。
準備ができたら、Windows Serverにアクセスしてみましょう。EC2インスタンスに割り当てられているEIP、Public DNSをブラウザに入力します。
IIS 詳細ログをインストールすると標準ログに加えて、詳細ログが別途出力されます。
・標準ログ:C:\inetpub\logs\LogFiles\W3SVC1\ログファイル名.log
#Software: Microsoft Internet Information Services 7.5 #Version: 1.0 #Date: 2013-03-18 04:12:28 #Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken 2013-03-18 04:12:28 10.132.128.130 GET /index.html - 80 - 10.xx.xx.xx ELB-HealthChecker/1.0 200 0 0 156 2013-03-18 04:12:57 10.132.128.130 GET /index.html - 80 - 10.xx.xx.xx ELB-HealthChecker/1.0 200 0 0 0 2013-03-18 04:13:22 10.132.128.130 GET / - 80 - 10.xx.xx.xx Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.22+(KHTML,+like+Gecko)+Chrome/25.0.1364.172+Safari/537.22 200 0 0 0 2013-03-18 04:13:22 10.132.128.130 GET /welcome.png - 80 - 10.xx.xx.xx Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.22+(KHTML,+like+Gecko)+Chrome/25.0.1364.172+Safari/537.22 200 0 0 31 2013-03-18 04:13:22 10.132.128.130 GET /favicon.ico - 80 - 10.xx.xx.xx Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.22+(KHTML,+like+Gecko)+Chrome/25.0.1364.172+Safari/537.22 404 0 2 0
・詳細ログ:C:\inetpub\logs\AdvancedLogs\ログファイル名.log
#Software: IIS Advanced Logging Module #Version: 1.0 #Start-Date: 2013-03-18 04:12:28.639 #Fields: date time cs-uri-stem cs-uri-query s-contentpath sc-status s-computername cs(Referer) sc-win32-status sc-bytes cs-bytes X-Forwarded-For 2013-03-18 04:12:28.140 /index.html - "C:\inetpub\wwwroot\index.html" 200 "AMAZONA-ABCDEFG" - 0 913 122 - 2013-03-18 04:12:57.985 /index.html - "C:\inetpub\wwwroot\index.html" 200 "AMAZONA-ABCDEFG" - 0 913 122 - 2013-03-18 04:13:22.697 /index.html - "C:\inetpub\wwwroot\index.html" 200 "AMAZONA-ABCDEFG" - 0 913 496 "59.xx.xx.xx" 2013-03-18 04:13:22.697 / - "C:\inetpub\wwwroot" 200 "AMAZONA-ABCDEFG" - 0 913 496 "59.xx.xx.xx" 2013-03-18 04:13:22.775 /welcome.png - "C:\inetpub\wwwroot\welcome.png" 200 "AMAZONA-ABCDEFG" "http://cm-1234567890.ap-northeast-1.elb.amazonaws.com/" 0 185173 512 "59.xx.xx.xx" 2013-03-18 04:13:22.853 /favicon.ico - "C:\inetpub\wwwroot\favicon.ico" 404 "AMAZONA-ABCDEFG" - -2147024894 1382 447 "59.xx.xx.xx"
それぞれのログにはELBからのHealth Checkが2回行われ、PCブラウザからのELB経由でのindex.htmlへのリクエストが1回ログされています。
標準ログを見ると、それぞれの場合のアクセス元IPに同じIPアドレスが記録されています。
逆に、詳細ログを見るとログのレコードの最後に(存在する場合は)X-Forwarded-Forの値が記録されています(上記の59.xx.xx.xxの部分)
詳細ログのドキュメント
・Advanced Logging Module
http://www.iis.net/learn/extensions/advanced-logging-module